#!/usr/bin/env python3
"""
优化显示布局演示

展示如何使用AttentionDetector的无重叠显示功能，
避免检测框、标签和文字相互遮挡。

使用方法:
    python examples/optimized_display_demo.py

功能特点:
- 智能布局优化，避免元素重叠
- 优先级显示（手机等分心物品优先显示）
- 自适应标签位置
- 状态信息智能定位
"""

import cv2
import sys
import os

# 添加项目根目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))

from kidsbuddy.vision.attention_detector import AttentionDetector


def main():
    """主函数"""
    print("=== 优化显示布局演示 ===")
    print("功能: 智能避免检测结果重叠显示")
    print("按 'q' 退出, 按 's' 截图保存")
    print("=" * 40)
    
    # 初始化注意力检测器
    try:
        detector = AttentionDetector(
            model_path="yolo11n-pose.pt",
            conf_threshold=0.3,
            enable_object_detection=True
        )
        print("✅ 注意力检测器初始化成功")
    except Exception as e:
        print(f"❌ 初始化失败: {e}")
        print("请确保已安装ultralytics并下载了模型文件")
        return
    
    # 打开摄像头
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("❌ 无法打开摄像头")
        return
    
    print("✅ 摄像头已打开")
    
    # 设置摄像头分辨率
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
    
    frame_count = 0
    
    while True:
        ret, frame = cap.read()
        if not ret:
            print("❌ 无法读取摄像头画面")
            break
        
        frame_count += 1
        
        try:
            # 进行注意力检测
            attention_status, reasons, keypoints_data, features = detector.process_frame(frame)
            
            # 使用优化布局绘制结果
            result_frame = detector.draw_optimized_results(
                frame, attention_status, reasons, keypoints_data, features
            )
            
            # 添加演示信息
            demo_info = [
                "优化显示布局演示",
                f"帧数: {frame_count}",
                "特点: 智能避免重叠",
                "按 'q' 退出, 's' 截图"
            ]
            
            # 在右上角显示演示信息
            for i, info in enumerate(demo_info):
                y_pos = 30 + i * 25
                cv2.putText(result_frame, info, (result_frame.shape[1] - 300, y_pos),
                           cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
            
            # 显示结果
            cv2.imshow('优化显示布局 - 注意力检测', result_frame)
            
            # 在控制台显示检测结果
            if frame_count % 30 == 0:  # 每30帧显示一次
                print(f"\n--- 第 {frame_count} 帧检测结果 ---")
                print(f"状态: {attention_status}")
                print(f"专注度: {int(features.get('focus_score', 0) * 100)}/100")
                
                # 显示检测到的物品
                detected_objects = keypoints_data.get('detected_objects', [])
                if detected_objects:
                    print("检测到的物品:")
                    for obj in detected_objects:
                        class_name = obj.get('class_name', 'unknown')
                        confidence = obj.get('confidence', 0.0)
                        interaction_info = obj.get('interaction_info', {})
                        
                        status_indicators = []
                        if interaction_info.get('in_interaction_zone'):
                            status_indicators.append("在学习区域")
                        if interaction_info.get('has_overlap'):
                            status_indicators.append("与人体重叠")
                        if interaction_info.get('is_distraction'):
                            status_indicators.append("分心物品")
                        
                        status_str = " | ".join(status_indicators) if status_indicators else "普通物品"
                        print(f"  • {class_name} (置信度: {confidence:.2f}) - {status_str}")
                
                # 显示布局优化信息
                display_layout = keypoints_data.get('display_layout')
                if display_layout and display_layout.get('layout_optimized'):
                    print("✅ 显示布局已优化，避免重叠")
                    elements_count = len(display_layout.get('display_elements', []))
                    print(f"   优化了 {elements_count} 个显示元素")
        
        except Exception as e:
            print(f"❌ 处理帧时出错: {e}")
            # 显示原始帧
            cv2.imshow('优化显示布局 - 注意力检测', frame)
        
        # 处理按键
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            print("用户退出")
            break
        elif key == ord('s'):
            # 保存截图
            filename = f"optimized_display_demo_{frame_count}.jpg"
            cv2.imwrite(filename, result_frame)
            print(f"📸 截图已保存: {filename}")
        elif key == ord('r'):
            # 重置检测器历史
            detector.reset_history()
            print("🔄 检测器历史已重置")
    
    # 清理资源
    cap.release()
    cv2.destroyAllWindows()
    print("✅ 演示结束，资源已清理")


def show_layout_comparison():
    """显示布局优化前后的对比"""
    print("\n=== 布局优化对比说明 ===")
    print("优化前的问题:")
    print("❌ 检测框相互重叠")
    print("❌ 标签文字被遮挡")
    print("❌ 状态信息覆盖重要内容")
    print("❌ 显示混乱，难以阅读")
    
    print("\n优化后的改进:")
    print("✅ 智能调整检测框位置")
    print("✅ 标签自动避开重叠区域")
    print("✅ 状态信息选择最佳位置")
    print("✅ 按优先级显示重要信息")
    print("✅ 整体布局清晰易读")
    
    print("\n优化策略:")
    print("1. 优先级排序: 分心物品 > 学习用品 > 其他")
    print("2. 空间分析: 计算重叠区域并自动调整")
    print("3. 智能定位: 为标签选择最佳显示位置")
    print("4. 自适应布局: 根据画面内容动态调整")


if __name__ == "__main__":
    show_layout_comparison()
    main()
